# 文件流

# 代开文件流，获得一个文件流对象
# 文件的访问模式： https://pqyiz16he9g.feishu.cn/docx/CbQddOyCeon5LWx4fxkcOKLJnDb

# 模式	描述
# r	以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。[一个字符一个字符读取。 文本文件]
# rb	以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
# r+	打开一个文件用于读写。文件指针将会放在文件的开头。
# rb+	以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
# w	打开一个文件只用于写入。如果该文件已存在则打开文件，并从开头开始编辑，即原有内容会被删除。如果该文件不存在，创建新文件。
# wb	以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件，并从开头开始编辑，即原有内容会被删除。如果该文件不存在，创建新文件。
# w+	打开一个文件用于读写。如果该文件已存在则打开文件，并从开头开始编辑，即原有内容会被删除。如果该文件不存在，创建新文件。
# wb+	以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件，并从开头开始编辑，即原有内容会被删除。如果该文件不存在，创建新文件。
# a	打开一个文件用于追加。如果该文件已存在，文件指针将会放在文件的结尾。也就是说，新的内容将会被写入到已有内容之后。如果该文件不存在，创建新文件进行写入。
# ab	以二进制格式打开一个文件用于追加。如果该文件已存在，文件指针将会放在文件的结尾。也就是说，新的内容将会被写入到已有内容之后。如果该文件不存在，创建新文件进行写入。
# a+	打开一个文件用于读写。如果该文件已存在，文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在，创建新文件用于读写。
# ab+	以二进制格式打开一个文件用于追加。如果该文件已存在，文件指针将会放在文件的结尾。如果该文件不存在，创建新文件用于读写。


f = open('test.txt', mode='r', encoding='utf-8')
# - 读操作
#   -   文件对象.read() : 默认读取整个文件。 或者可以读取指定大小的数据
#   -   文件对象.readlines()
#   -   文件对象.readline()

print(f.read())
# print(f.read(10)) # helloworld
# print(f.readline()) # helloworld
# print(f.readlines()) # ['helloworld\n', 'pythonjava\n', 'c++python\n', 'fastapi-django']

f.close()

# 写操作
wf = open('test2.txt', mode='w', encoding='utf-8')
# wf.write('hello\n')
for i in range(3):
    wf.write('hello\n')
wf.close()

# 指针的移动操作
# 需求：在第一个hello的后面添加一个：world
# wf = open('test2.txt', mode='r+', encoding='utf-8')
# wf.write('world\n')
# wf.close()
# 写入如下：会被覆盖
# world
# hello
# hello

# wf = open('test2.txt', mode='r+', encoding='utf-8')
# # # 把第一个Hello后面的内容先读取出来。
# after = wf.read() # 读完之后，指针又到了文件的末尾
# # # 把指针移动到第一个hello的后面
# wf.seek(5,0)
# wf.write('world\n'+after)
# wf.close()
# 输出如下：指针移到第五个为位置，然后写入world，后面追加位置5之后的内容
# helloworld
# hello
# hello
# hello

# with语句来操作文件流，关闭资源使用
# 二、with语句
# 对于系统资源如文件、数据库连接、socket 而言，应用程序打开这些资源并执行完业务逻辑之后，必须做的一件事就是要关闭（释放）该资源。
# 比如 Python 程序打开一个文件，往文件中写内容，写完之后，就要关闭该文件，如果不关闭会出现什么情况呢？
# 极端情况下会出现 Too many open files 的错误，因为系统允许你打开的最大文件数量是有限的。
with open('test3.txt',mode='w+',encoding='utf-8') as f:
    for i in range(3):
        f.write('hello\n')
# 输出
# hello
# hello
# hello

